紐づいたモデルのデータをまとめて取得する
class TestController < ApplicationController def index @companys = Company.includes(:employees).all end end
<table> <thead> <tr> <th>id</th> <th>名前</th> <th>従業員id</th> <th>従業員氏名</th> </tr> </thead> <tbody> <% @companys.each do |company| %> <% company.employees.each_with_index do |employee, index| %> <tr> <% if index == 0 %> <td rowspan="<%= company.employees.count %>"><%= company.id %></td> <td rowspan="<%= company.employees.count %>"><%= company.name %></td> <% end %> <td><%= employee.id %></td> <td><%= employee.name %></td> </tr> <% end %> <% end %> </tbody> </table>
includesを使用することで、紐づいたモデルのデータをまとめて取得し、パフォーマンスを改善することができます。
includesは記入しなくても動作しますが、紐づいたモデルのデータを取得するたびにクエリを発行してしまう(N+1)問題が発生します。
includesを使用すると、紐づいたデータをまとめて取得することができるため、N+1問題を解決することができます。
includesは
のような形式で記入してください。
複数のモデルのフィールドを取得したいときはincludesの引数を,区切りで増やすことができます。
上の例ではCompanyを1側、Employeeを多側としてincludesを使用しています。
紐づいたモデルのさらに先の紐づいたデータを集計するときは、
のように記入します。
例えば、Employeeが1側でそれに多側のFamilyが紐づいていた場合は
のようになります。
さらにFamilyが1側でそれに多側のFavoriteが紐づいていた場合は
のように{}で入れ子にしていきます。
includesは記入しなくても動作しますが、紐づいたモデルのデータを取得するたびにクエリを発行してしまう(N+1)問題が発生します。
includesを使用すると、紐づいたデータをまとめて取得することができるため、N+1問題を解決することができます。
includesは
モデル.includes(:取得するモデルのフィールド).その他のメソッド
のような形式で記入してください。
複数のモデルのフィールドを取得したいときはincludesの引数を,区切りで増やすことができます。
上の例ではCompanyを1側、Employeeを多側としてincludesを使用しています。
紐づいたモデルのさらに先の紐づいたデータを集計するときは、
モデル.includes(取得するモデルのフィールド: :もう一つ先のフィールド)
のように記入します。
例えば、Employeeが1側でそれに多側のFamilyが紐づいていた場合は
Company.includes(employees: :families).all
のようになります。
さらにFamilyが1側でそれに多側のFavoriteが紐づいていた場合は
Company.includes(employees: {families: :favorites})
のように{}で入れ子にしていきます。